解释器的组成
在HotSpot中,解释器主要由以下几个部分组成:
解释器(interpreter)
解释执行的功能组件,在HotSpot中,实现了两种解释器,一种是虚拟机默认使用的模板解释器(TemplateInterpreter),另一种是C++解释器(CppInterpreter)
代码生成器(code generator)
利用解释器的宏汇编器(MASM)向代码缓存空间写入生成的代码
InterpreterCodelet
由解释器运行的代码片段,在HotSpot中,所有由代码生成器生成的代码都由一个Codelet来表示,面向解释器的Codelet称为InterpreterCodelet,由解释器进行维护。
转发表(dispatch table)
为方便快速找到与字节码对应的机器码,模板解释器使用了转发表,它按照字节码的顺序,包含了所有字节码到机器码的关联信息。模板解释器拥有两张转发表,一张是正常模式表,另一张表用来使解释器进入safepoint,转发表最大256个条目,这是由单字节表示的字节码的最大数量。
解释器如何工作
在系统启动时,解释器按照预定义的规则,为所有字节码分别创建能够在具体计算机平台上运行的机器码(code),并存放在特定位置。当运行时环境需要解释字节码时,就到指定位置取出相应的code,直接在机器上运行。
code模块
CodeCache模块
代码高速缓存。JVM在内存中分配了一块区域,用于代码缓存区,即CodeCache,用来保存那些在运行时生成的可在目标机器上运行的机器码,通过VM选项CodeCacheExpansionSize、InitialCodeCacheSize和ReservedCodeCacheSize可以配置该空间大小。
CodeBlob模块
CodeBlob用作描述Code Cache中所有的缓存项。
字节码表
Bytecodes模块提供了一张字节码表来提供索引服务,其他模块利用bytecode的编号从表中相应位置取得字节码信息。
Code Cache
CodeCache指代码高速缓存,主要用作生成和存储本地代码,这些代码片段包括已经编译好的Java方法和RuntimeStubs。Code Cache空间是由虚拟机托管的一块内存区域,在Jconsole中,也将其与Perm Gem一起合称为非堆内存。